<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 17/03/2012.
   * @last_update 24/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Unidades extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /* Seta a tabela a ser usada*/
    protected function _setup(){
      $this->_name = 'unidade';
      
      parent::_setup();
    }
    
    /**
     * Retorna a string SELECT como todos os campos solicitados por parametro.
     * @param array Array com as opções de colunas e clausulá WHERE.
     *              Ex: Colunas:
     *                  $arrOptions['fields_perfil'] = array('campo1', 'campo2', 'campoN').
     *                  
     *                  WHERE
     *                    $arrOptions['where_clause'] = array('ds_peril' => 'usuario')
     * @param string  Comparação.Ex: =, LIKE NOT LIKE, etc  
     *                    
     * @return string                   
     */
    public function _get($arrOptions = array(), $strComparison = '='){
      $arrAlias     = array('u' => $this->_name);
      
      if(isset($arrOptions['fields']))
        $arrCols = $arrOptions['fields'];
      else
        $arrCols = array('u.*');
          
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAlias, $arrCols)
      ->where('u.ds_situacao = ?', self::IND_ATIVO)
      ;
      
      if(isset($arrOptions['where_clause']))
        foreach($arrOptions['where_clause'] as $strkey => $strValue)
          $strSql->where($strkey . $strComparison . ' ?', $strValue);  
      $strSql->order('u.idUnidade');
      
      return $strSql;
    }
    
    /**
     * Retorna o registro
     * 
     * @param integer Id do registro
     * @return databasen result
     */
    public function get($intId = null){
      if($intId == null)
        return false;
      
      $arrOptions['fields'] = array(
        'u.idUnidade',  
        'idFuncionario' => 'u.idDiretor',
        'u.idCidade',
        'u.ds_sigla',  
        'u.ds_unidade',  
        'u.ds_razao_social',  
        'u.ds_cnpj',  
        'u.ds_endereco',  
        'u.nr_unidade',  
        'u.ds_complemento',  
        'u.ds_cep',  
        'u.ds_bairro',  
        'u.ds_fone',  
        'u.ds_site',  
        'u.ds_situacao',  
        'u.ds_logotipo',  
        'u.dt_insercao',
      );
      
      $arrOptions['where_clause'] = array(
        'u.idUnidade'  => $intId   
      );
      
      $strSql = $this->_get($arrOptions);  
        
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.ds_situacao = ?', self::IND_ATIVO);
      
      $objResult = $this->fetchAll($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * 
     * @return database
     */
    public function getById($intId){
      $arrAliasFuncionarios  = array('f' => 'funcionarios');
      $arrColsFuncionarios   = array();
      
      $arrAliasCidades  = array('c' => 'cidades');
      $arrColsCidades   = array();
      
      $arrOptions['fields'] = array(
        'u.idUnidade',  
        'idFuncionario' => 'u.idDiretor',
        'u.idCidade',
        'u.ds_sigla',  
        'u.ds_unidade',  
        'u.ds_razao_social',  
        'u.ds_cnpj',  
        'u.ds_endereco',  
        'u.nr_unidade',  
        'u.ds_complemento',  
        'u.ds_cep',  
        'u.ds_bairro',  
        'u.ds_fone',  
        'u.ds_site',  
        'u.ds_situacao',  
        'u.ds_logotipo',  
        'u.dt_insercao',
        'u.dt_atualizacao',
        'f.ds_nome',
        'c.ds_cidade'
      );
      
      $arrOptions['where_clause'] = array(
        'u.idUnidade'  => $intId, 
      );
        
      $strSql = $this->_get($arrOptions)
      ->join($arrAliasFuncionarios, 'f.idFuncionario = u.idDiretor', $arrColsFuncionarios)
      ->join($arrAliasCidades, 'c.idCidade = u.idCidade', $arrColsCidades)
      ;
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome. 
     * 
     * @param string  Nome do menu
     * @param string  Nome da controller
     * 
     * @return database_result
     */
    public function getByNomeESigla($strDs, $strDs2){  
      $arrOptions['fields'] = array(
        'u.idUnidade',  
        'u.ds_sigla',  
        'u.ds_unidade',  
        'u.ds_razao_social',  
        'u.ds_cnpj',  
        'u.ds_situacao',  
      );
      
      if($strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'u.ds_sigla'  => '%' . $strDs . '%', 
          'u.ds_unidade' => '%' . $strDs2 . '%'      
        );   
        
        $strComparison = ' LIKE ';
      }  
      elseif($strDs && !$strDs2){ 
        $arrOptions['where_clause'] = array(
          'u.ds_sigla'  => '%' . $strDs . '%'
        );
        
        $strComparison = ' LIKE ';
      }  
      elseif(!$strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'u.ds_unidade' => '%' . $strDs2 . '%'      
        );
        
        $strComparison = ' LIKE ';
      }  
      else{
        $arrOptions['where_clause'] = array(
          1  => 1, 
        );
        
        $strComparison = ' = ';
      }
      
      $strSql = $this->_get($arrOptions, $strComparison);
      $objResult = $this->getAdapter()->fetchAll($strSql);            
      return Core_Commons::onLoad($objResult);
    }
    
  /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*' =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'         =>  array('allowEmpty'  => false, 'fields' => 'ds_sigla'),
        'Unidade'       =>  array('allowEmpty'  => false, 'fields' => 'ds_unidade'),
        'Razão Social'  =>  array('allowEmpty'  => false, 'fields' => 'ds_razao_social'),
        'CNPJ'          =>  array('allowEmpty'  => false, 'fields' => 'ds_cnpj'),
        'Endereço'      =>  array('allowEmpty'  => false, 'fields' => 'ds_endereco'),
        'Numero'        =>  array('allowEmpty'  => false, 'fields' => 'nr_unidade'),
        'Complemento'   =>  array('allowEmpty'  => false, 'fields' => 'ds_complemento'),
        'CEP'           =>  array('allowEmpty'  => false, 'fields' => 'ds_cep'),
        'Bairro'        =>  array('allowEmpty'  => false, 'fields' => 'ds_bairro'),
        'Cidade'        =>  array('allowEmpty'  => false, 'fields' => 'idCidade'),
        'Telefone'      =>  array('allowEmpty'  => false, 'fields' => 'ds_fone'),
        'Site'          =>  array('allowEmpty'  => false, 'fields' => 'ds_site'),
        'Logomarca'     =>  array('allowEmpty'  => false, 'fields' => 'ds_logotipo'),
        'Diretor'       =>  array('allowEmpty'  => false, 'fields' => 'idFuncionario'),
        'Situaçao'      =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
        'Inserção'      =>  array('allowEmpty'  => false, 'fields' => 'dt_insercao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intId = null){
      $objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
                              
      $arrDados['ds_sigla']         = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_unidade']       = $objDadosInput->ds_unidade;
      $arrDados['ds_razao_social']  = ucfirst($objDadosInput->ds_razao_social);
      $arrDados['ds_cnpj']          = $objDadosInput->ds_cnpj;
      $arrDados['ds_endereco']      = ucfirst($objDadosInput->ds_endereco);
      $arrDados['nr_unidade']       = $objDadosInput->nr_unidade;
      $arrDados['ds_complemento']   = ucfirst($objDadosInput->ds_complemento);
      $arrDados['ds_cep']           = $objDadosInput->ds_cep;
      $arrDados['ds_bairro']        = ucfirst($objDadosInput->ds_bairro);
      $arrDados['idCidade']         = $objDadosInput->idCidade;
      $arrDados['ds_fone']          = $objDadosInput->ds_fone;
      $arrDados['ds_site']          = $objDadosInput->ds_site;
      $arrDados['ds_logotipo']      = $objDadosInput->ds_logotipo;
      $arrDados['idDiretor']        = $objDadosInput->idFuncionario;
      $arrDados['ds_situacao']      = $objDadosInput->ds_situacao;
            
      if($intId == null){
        $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
        $arrDados['dt_atualizacao'] = 'NULL';
            
        $strSql = $this->select()
        ->where("ds_sigla = ?", $arrDados['ds_sigla'])
        ->where("ds_unidade = ?", $arrDados['ds_unidade'])
        ;
        
        if($this->fetchAll($strSql)->current())
          throw new Exception(
            'Módulo já cadastrado com o nome "' . 
            $arrDados['ds_unidade'] . 
            '" ou com a sigla "' . 
            $arrDados['ds_sigla'] . 
            '"!', '3'
          );
        else{
          return $this->insert($arrDados);
        }  
      }
      else{ 
        $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
        
        return $this->update($arrDados, 'idUnidade = ' . $intId);  
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      
      $strWhere = "idUnidade = '" . $intId . "'";
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
            
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
  }  